#pragma once

#include "Module.h"

class Module;
class Function;
class Instruction;
class GlobalVariable;
class LocalVariable;

class IR_optimizer {
public:
    /// @brief 构造函数
    /// @param _module
    explicit IR_optimizer(Module *_module);

    /// @brief 析构函数
    ~IR_optimizer() = default;

    // 执行所有优化（目前只实现死代码消除）
    void optimizeAll();

    // 死代码消除主函数
    void deadCodeElimination();

    // 消除未使用的全局变量
    void eliminateUnusedGlobalVariables();

    // 消除未使用的局部变量
    void eliminateUnusedLocalVariables(Function *func);

    // 消除未使用的函数
    void eliminateUnusedFunctions();

    // 消除函数内部的死代码
    void eliminateDeadCodeInFunction(Function *func);

    // 判断一条指令是否可以移除
    bool shouldRemoveInstruction(Instruction *inst);

    //常量传播
    void constantPropagation();

    // 其他优化函数（暂不实现，仅作声明）
    void optimizeGlobalVariables();
    void optimizeFunctions();
    void functionInlining();
    void registerAllocationOptimization();
private:
    Module *module;
};

